CFLAGS:= -m32 # 表示32位程序
CFLAGS+= -Qn # 去掉gcc版本信息
# CFLAGS+= -fno-builtin # 不需要gcc的内置函数，比如memcpy函数就是内置函数，遇到这个函数gcc会替换成自己的内置函数，因为性能更高。但在这里无法依赖任何库
# CFLAGS+= -nostdinc # 不需要标准头文件，也就是c的标准库无法使用
CFLAGS+= -fno-pic # pic是position independent code的缩写，这里表示不需要位置无关的代码。应用是位置无关的，可加载到内存任何位置执行，但内核中很难使用起来，只适合位置相关
# CFLAGS+= -fno-pie # 不需要位置无关的可执行程序，position independent executable
# CFLAGS+= -nostdlib # 不需要标准库，所有的标准库都需要自己写
# CFLAGS+= -fno-stack-protector # 不需要栈保护，这样可以很容易的分析栈
CFLAGS+= -fomit-frame-pointer # 不需要栈帧
CFLAGS+= -mpreferred-stack-boundary=2 # 不需要栈对齐
CFLAGS+= -fno-asynchronous-unwind-tables # 不需要CFI信息
CFLAGS:= $(strip ${CFLAGS}) # strip 函数的作用是去除字符串中开头和结尾的空白字符（包括空格、制表符等），并且会将字符串中连续的多个空白字符压缩为单个空格。

.PHONY: test.s # PHONY依赖，每次make时都会重新编译目标文件，如果不是则如果test.c的时间戳小于test.s的则不会重新生成了
test.s: test.c
	gcc $(CFLAGS) -S $< -o $@
